﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace CityGames
{
    public partial class FormEmpleadosAlta : Form
    {
        static private FormContenedor contenedor;
        private ErrorProvider epNombre;
        private ErrorProvider epApellidos;
        private ErrorProvider epDni;
        private ErrorProvider epTelefono;
        private ErrorProvider epEmail;
        private ErrorProvider epPassword;
        private DataRow dr;
        private bool modificar;
        private bool visualizar;
        private string dniSinModificar;
        private Empleado nuevoEmpleado;

        public FormEmpleadosAlta()
        {
            InitializeComponent();
        }

         private void FormEmpleadosAlta_Load(object sender, EventArgs e)
         {
             try
             {
                 nuevoEmpleado = new Empleado();
                 contenedor = (FormContenedor)MdiParent;

                 modificar = false;
                 visualizar = false;

                 dniSinModificar = "";

                 TipoEmpleado tipoEmpleado = new TipoEmpleado(); 

                 epNombre = new ErrorProvider();
                 epNombre.SetIconAlignment(tbNombre, ErrorIconAlignment.MiddleRight);
                 epNombre.SetIconPadding(tbNombre, 15);
                 epNombre.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                 epApellidos = new ErrorProvider();
                 epApellidos.SetIconAlignment(tbApellidos, ErrorIconAlignment.MiddleRight);
                 epApellidos.SetIconPadding(tbApellidos, 15);
                 epApellidos.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                 epDni = new ErrorProvider();
                 epDni.SetIconAlignment(tbDni, ErrorIconAlignment.MiddleRight);
                 epDni.SetIconPadding(tbDni, 35);
                 epDni.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;
         
                 epTelefono = new ErrorProvider();
                 epTelefono.SetIconAlignment(tbTelefono, ErrorIconAlignment.MiddleRight);
                 epTelefono.SetIconPadding(tbTelefono, 15);
                 epTelefono.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;
          
                 epEmail = new ErrorProvider();
                 epEmail.SetIconAlignment(tbEmail, ErrorIconAlignment.MiddleRight);
                 epEmail.SetIconPadding(tbEmail, 15);
                 epEmail.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                 epPassword = new ErrorProvider();
                 epPassword.SetIconAlignment(tbPassword,ErrorIconAlignment.MiddleRight);
                 epPassword.SetIconPadding(tbPassword, 15);
                 epPassword.BlinkStyle = ErrorBlinkStyle.BlinkIfDifferentError;

                 cbTipo.DataSource = tipoEmpleado.ObtenerTipoEmpleado();
                 cbTipo.DisplayMember = "NombreTipo";


                 DataTable asd = new DataTable();
             }
             catch (Exception ex)
             {
                 MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
             }
         }

         private bool ValidarCampos()
         {
             Empleado nuevoEmpleado = new Empleado();

             string errores = "";
             bool resultado = true;
             string expReTbNombre = @"^\D+$";
             string expReTbApellidos = @"^\D+$";
             string expReTbDni = @"^[0-9]{8}$";
             string expReTbTelefono = @"^[0-9]{9}$";
             string expReTbEmail = @"^(([^<>()[\]\\.,;:\s@\""]+(\.[^<>()[\]\\.,;:\s@\""]+)*)|(\"".+\""))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$";
             string expReTbPassword = @"^[a-zA-Z0-9]{8,20}$";

             try
             {
                 if (!Regex.Match(tbNombre.Text, expReTbNombre).Success)
                 {
                     resultado = false;
                     errores += "- Nombre incorrecto\n";

                     epNombre.SetError(tbNombre, "El nombre sólo puede contener caracteres alfabéticos");
                     tbNombre.Focus();
                     tbNombre.SelectAll();
                 }
                 else
                 {
                     epNombre.SetError(tbNombre, null);
                 }

                 if (!Regex.Match(tbApellidos.Text, expReTbApellidos).Success)
                 {
                     resultado = false;
                     errores += "- Apellidos incorrectos\n";

                     epApellidos.SetError(tbApellidos, "Los Apellidos sólo pueden contener caracteres alfabéticos");
                     tbApellidos.Focus();
                     tbApellidos.SelectAll();
                 }
                 else
                 {
                     epApellidos.SetError(tbApellidos, null);
                 }

                 if (!Regex.Match(tbTelefono.Text, expReTbTelefono).Success)
                 {
                     resultado = false;
                     errores += "- Teléfono incorrecto\n";

                     epTelefono.SetError(tbTelefono, "El teléfono debe tener formato 966123456");
                     tbTelefono.Focus();
                     tbTelefono.SelectAll();
                 }
                 else
                 {
                     epTelefono.SetError(tbTelefono, null);
                 }

                 if (!Regex.Match(tbEmail.Text, expReTbEmail).Success)
                 {
                     resultado = false;
                     errores += "- E-mail incorrecto\n";

                     epEmail.SetError(tbEmail, "El e-mail debe tener formato luis@mail.es");
                     tbEmail.Focus();
                     tbEmail.SelectAll();
                 }
                 else
                 {
                     epEmail.SetError(tbEmail, null);
                 }

                 if (!Regex.Match(tbPassword.Text, expReTbPassword).Success)
                 {
                     resultado = false;
                     errores += "- Password incorrecto\n";

                     epPassword.SetError(tbPassword, "La contraseña debe estar compuesta por un mínimo de ocho caracteres alfanuméricos");
                     tbPassword.Focus();
                     tbPassword.SelectAll();
                 }
                 else
                 {
                     epPassword.SetError(tbPassword, null);
                 }

                 if (!Regex.Match(tbDni.Text, expReTbDni).Success)
                 {
                     resultado = false;
                     errores += "- DNI incorrecto\n";

                     epDni.SetError(tbDni, "El DNI debe tener formato 00000000X");
                     tbDni.Focus();
                     tbDni.SelectAll();
                 }
                 else
                 {
                     if (!modificar || (modificar && tbDni.Text != dniSinModificar))
                     {
                         if (nuevoEmpleado.ExisteEmpleado(tbDni.Text))
                         {
                             resultado = false;
                             errores += "- El empleado ya existe\n";

                             epDni.SetError(tbDni, "El empleado con DNI: " + tbDni.Text + " ya existe.");
                             tbDni.Focus();
                             tbDni.SelectAll();
                         }
                     }
                     else
                     {
                         epDni.SetError(tbDni, null);
                     }
                 }

                 if (!resultado)
                 {
                     MessageBox.Show(errores, "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                 }

             }
             catch (Exception ex)
             {
                 resultado = false;
                 MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
             }

             return resultado;
         }

        private void bAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                Empleado nuevoEmpleado = new Empleado();

                if (ValidarCampos())
                {
                    if (!modificar)
                    {
                        nuevoEmpleado.Nombre = tbNombre.Text;
                        nuevoEmpleado.Apellidos = tbApellidos.Text;
                        nuevoEmpleado.Dni = tbDni.Text;
                        nuevoEmpleado.Dni += tbLetraDni.Text;
                        nuevoEmpleado.Telefono = tbTelefono.Text;
                        nuevoEmpleado.E_mail = tbEmail.Text;
                        nuevoEmpleado.Password = tbPassword.Text;
                        nuevoEmpleado.Tipo = cbTipo.Text;

                        if (rbSexo1.Checked == true)
                        {
                            nuevoEmpleado.Sexo = "Hombre";
                        }
                        else
                        {
                            nuevoEmpleado.Sexo = "Mujer";
                        }

                        if (nuevoEmpleado.AltaEmpleado())
                        {
                            LimpiarForm();
                            MessageBox.Show("Empleado insertado correctamente.", "Correcto", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                        else
                        {
                            MessageBox.Show("Ha ocurrido un error en la inserción.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        dr["Nombre"] = tbNombre.Text;
                        dr["Apellidos"] = tbApellidos.Text;
                        dr["Dni"] = tbDni.Text + tbLetraDni.Text;
                        dr["Telefono"] = tbTelefono.Text;
                        dr["E_mail"] = tbEmail.Text;
                        dr["Password"] = tbPassword.Text;
                        dr["Tipo"] = cbTipo.Text;
                        if (rbSexo1.Checked == true)
                        {
                            nuevoEmpleado.Sexo = "Hombre";
                        }
                        else
                        {
                            nuevoEmpleado.Sexo = "Mujer";
                        }
                        dr["Sexo"] = nuevoEmpleado.Sexo;

                        MessageBox.Show("Datos de empleado modificados correctamente.", "Correcto", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        dniSinModificar = "";
                        modificar = false;

                        contenedor.hijoFormEmpleadosGestion.ModificarDatos(dr);
                        contenedor.hijoFormEmpleadosGestion.UpdateEmpleado(dr);
                        contenedor.hijoFormEmpleadosGestion.Focus();

                        LimpiarForm();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
   
        }

        public void LimpiarForm()
        {
            tbNombre.Text = "";
            tbApellidos.Text = "";
            tbDni.Text = "";
            tbLetraDni.Text = "";
            rbSexo1.Checked = true;
            rbSexo2.Checked = false;
            tbTelefono.Text = "";
            tbEmail.Text = "";
            tbPassword.Text = "";
            cbTipo.Text = "";
            bCancelar.Text = "Cancelar";
            //bAceptar.Show();
            bAceptar.Enabled = true;
            bAceptar.Text = "Aceptar";
        }


        private void bCancelar_Click(object sender, EventArgs e)
        {
            try
            {
                if (visualizar)
                {
                    visualizar = false;
                    contenedor.hijoFormEmpleadosGestion.Focus();
                }
                else if (modificar)
                {
                    modificar = false;
                    contenedor.hijoFormEmpleadosGestion.Focus();
                }
                else
                {
                    contenedor.hijoFormMenuPrincipal.Focus();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void RecibirDatos(DataRow datos)
        {
            string sexo = "";
            string dniFinal = "";
            char[] dni = new char[9];
            string auxDni = "";

            try
            {
                dr = datos;

                tbNombre.Text = datos["Nombre"].ToString();
                tbApellidos.Text = datos["Apellidos"].ToString();

                //tbDni.Text = datos["Dni"].ToString();
                auxDni = datos["Dni"].ToString();
                for (int i = 0; i < 9; i++)
                    dni[i] = auxDni[i];
                for (int i = 0; i < 8; i++)
                    dniFinal += dni[i].ToString();

                tbDni.Text = dniFinal;
                tbLetraDni.Text = (dni[8]).ToString();

                sexo = datos["Sexo"].ToString();
                if (sexo == "Hombre")
                    rbSexo1.Checked = true;
                else
                    rbSexo2.Checked = true;

                tbTelefono.Text = datos["Telefono"].ToString();
                tbEmail.Text = datos["E_mail"].ToString();
                tbPassword.Text = datos["Password"].ToString();
                cbTipo.Text = datos["Tipo"].ToString();
                //sexo = datos["Sexo"].ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void ModificarDatos(DataRow datos)
        {
            try
            {
                RecibirDatos(datos);
                modificar = true;
                visualizar = false;
                dniSinModificar = datos["Dni"].ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void VisualizarDatos(DataRow datos)
        {
            try
            {
                RecibirDatos(datos);
                modificar = false;
                visualizar = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void FormEmpleadosAlta_Activated(object sender, EventArgs e)
        {
            try
            {
                tbNombre.Enabled = !visualizar;
                tbApellidos.Enabled = !visualizar;
                tbDni.Enabled = !visualizar;
                tbTelefono.Enabled = !visualizar;
                tbEmail.Enabled = !visualizar;
                tbPassword.Enabled = !visualizar;
                cbTipo.Enabled = !visualizar;
                rbSexo1.Enabled = !visualizar;
                rbSexo2.Enabled = !visualizar;
                bAceptar.Enabled = !visualizar;
    

                epNombre.SetError(tbNombre, null);
                epApellidos.SetError(tbApellidos, null);
                epDni.SetError(tbDni, null);
                epTelefono.SetError(tbTelefono, null);
                epEmail.SetError(tbEmail, null);
                epPassword.SetError(tbPassword, null);

                if (visualizar)
                {
                    lbTitulo.Text = "Vizualizar Empleado"; 
                    //bAceptar.Hide();
                    bAceptar.Enabled = false;
                    bCancelar.Text = "Volver";
                }
                else if (modificar)
                {
                    tbDni.Enabled = false;
                    //bAceptar.Show();
                    bAceptar.Text = "Guardar";
                    bCancelar.Text = "Volver";
                    lbTitulo.Text = "Editar Empleado";
                }
                else
                {
                    lbTitulo.Text = "Nuevo Empleado";
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void NuevoEmpleado(object sender, EventArgs e)
        {
            modificar = false;
            visualizar = false;
            FormEmpleadosAlta_Activated(sender, e);
        }

        private void tbDni_Leave(object sender, EventArgs e)
        {
            string expReTbDni = @"^[0-9]{8}$";
            try
            {
                if (tbDni.Text != "")
                {
                    if (Regex.Match(tbDni.Text, expReTbDni).Success)
                    {
                        int nif = int.Parse(tbDni.Text);
                        int numeroModulo = nif % 23;
                        string cadenaLetra = "TRWAGMYFPDXBNJZSQVHLCKE";
                        tbLetraDni.Text = cadenaLetra.Substring(numeroModulo, 1);
                        epDni.SetError(tbDni, null);
                    }
                    else
                    {
                        epDni.SetError(tbDni, "El dni debe ser un número");
                        tbDni.Focus();
                        tbDni.SelectAll();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Se han encontrado errores.", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

    }
}
